package Day_0203.MYSQL;

/**
 * @author zxc
 * @date 2023/02/03 22:46
 **/
public class SQL_Execution_Process {
    public static void main(String[] args) {
        /**
         * MYSQL中某条SQL语句的执行过程
         * ===》
         * 请分析下面这条SQL语句的执行过程 ：
         * select name from t_user where id=1
         *
         * 1. 取得链接 ：
         * 使用到 MySQL 中的连接器。
         *
         * 2. 查询缓存 ：
         * （1）key 为 SQL 语句，value 为查询结果，如果查到就直接返回。
         * （2）不建议使用次缓存，在 MySQL 8.0 版本已经将查询缓存删除，也就是说 MySQL 8.0 版本后不存在此功能。
         *  ===》
         *  缓存问题 ：
         *  （1）即，若是某条记录在缓存中，若是其在数据库中已经被修改，但是查询返回的仍然是之前的旧值;
         *  （2）后续查询该记录的查询语句所获取的结果，皆为旧值;直至缓存失效，需要去数据库中更新 && 重建缓存;
         *
         * 3. 分析器 ：
         * （1）分为词法分析和语法分析。
         * （2）此阶段只是做一些 SQL 解析，语法校验，所以一般语法错误在此阶段。
         *
         * 4. 优化器 ：
         * 在表里有多个索引的时候，决定使用哪个索引；或者一个语句中存在多表关联的时候（join），决定各个表的连接顺序。
         *
         * 5. 执行器 ：
         * （1）执行语句的时候还要判断是否具备此权限，没有权限就直接返回提示没有权限的错误；
         * （2）有权限则打开表，根据表的引擎定义，去使用这个引擎提供的接口，获取这个表的第一行，判断 id 是都等于 1。
         * （3）如果是，直接返回；如果不是继续调用引擎接口去下一行，重复相同的判断，直到取到这个表的最后一行，最后返回。
         *
         */
    }
}
